/*
 * ReservaDaoJdbc.java      1.0   24/02/2011
 *
 * Copyright Grupo 3A UPC
 * All rights reserved.
 *
 * Contiene el manejador JDBC para la Reserva 
 */

package pe.edu.upc.dew.grupo3a.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;

import pe.edu.upc.dew.grupo3a.model.Funcion;
import pe.edu.upc.dew.grupo3a.model.Reserva;

public class ReservaDaoJdbc extends SimpleJdbcDaoSupport implements
ReservaDao {

	ClienteDao clienteDao;
	FuncionDao funcionDao;
	
	public void setClienteDao(ClienteDao clienteDao) {
		this.clienteDao = clienteDao;
	}

	public void setFuncionDao(FuncionDao funcionDao) {
		this.funcionDao = funcionDao;
	}

	@Override
	public Reserva getReservaPorCodigo(String codigoreserva) {
		try {
			return getSimpleJdbcTemplate()
			.queryForObject(
					"select r.codigoreserva,r.codigofuncion,r.codigocliente,r.entradas,r.preciounitario,r.total," +
					"r.fechareserva,r.codigodeposito,r.banco,c.dni " +
					"from reserva r, cliente c " +
					"where r.codigoreserva=? and r.codigocliente=c.codigocliente",
					new RowMapper<Reserva>(){
						public Reserva mapRow(ResultSet rs, int rowNum) throws SQLException {
							Reserva reserva = new Reserva();
							reserva.setCliente(clienteDao.getClientePorDNI(rs.getString("dni")));
							reserva.setFuncion(funcionDao.getFuncionPorCodigo(rs.getString("codigofuncion")));
							reserva.setCodigo(rs.getString("codigoreserva"));
							reserva.setCodigoDeposito(rs.getString("codigodeposito"));
							reserva.setBanco(rs.getString("banco"));
							reserva.setFechaReserva(rs.getDate("fechareserva"));
							reserva.setNroEntradas(rs.getInt("entradas"));
							reserva.setTotal(rs.getDouble("total"));
							return reserva;
						}
					},
					codigoreserva);
			
		} catch(DataAccessException ex ){
			//System.out.println(ex.getMessage());
			return null;
		}
	}

	@Override
	public void actualizarReserva(Reserva reserva) {
		getSimpleJdbcTemplate().update("Update reserva set " +
				"codigofuncion=?,codigocliente=?,entradas=?,preciounitario=?,total=?,"+
				"fechareserva=?,codigodeposito=?,banco=? " +
				"where codigoreserva=?",
				reserva.getFuncion().getCodigoFuncion(),reserva.getCliente().getCodigoCliente(),reserva.getNroEntradas(),
				reserva.getFuncion().getPrecio(),reserva.getTotal(),reserva.getFechaReserva(),reserva.getCodigoDeposito(),
				reserva.getBanco(),reserva.getCodigo());
		
	}

	@Override
	public boolean validarButacasDisponibles(String codigofuncion, int entradas) {
		boolean result=true;
		Funcion funcion = funcionDao.getFuncionPorCodigo(codigofuncion);
		if ((funcion.getButacasVendidas()+ entradas)> funcion.getSala().getButacas())
			result = false;
		return result;
	}

	@Override
	public void insertarReserva(Reserva reserva) {
		getSimpleJdbcTemplate().update("insert into reserva (codigoreserva ,codigofuncion,codigocliente," +
				"entradas,preciounitario,total,fechareserva,codigodeposito,banco)" +
				"values (?,?,?,?,?,?,?,?,?) ",
				reserva.getCodigo(),reserva.getFuncion().getCodigoFuncion(),reserva.getCliente().getCodigoCliente(),
				reserva.getNroEntradas(), reserva.getFuncion().getPrecio(),reserva.getTotal(),reserva.getFechaReserva(),
				reserva.getCodigoDeposito(),reserva.getBanco());
	}

}
